package com.jxb.test20241021;

/**
 * 计数器算法
 *  需定义时间、阈值和计数器
 *  限流方法逻辑
 *      1：判断是否超过了时间窗，超过了重置计数器，并将时间设置为当前时间
 *      2：qps与阈值的比较
 */
public class Count1 {

    private static long timestamp;//时间
    private static long limit = 10L;//阈值
    private static long count;//计数器

    public static void main(String[] args) {
        //模拟并发
        while (true) {
            try {
                Thread.sleep(110);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (!limit()) {
                System.out.println("限流了... ...");
            }
        }

    }

    public static boolean limit() {
        long currentTime = System.currentTimeMillis();
        //判断1s的时间窗是否已过
        if (timestamp - System.currentTimeMillis() > 1000) {
            timestamp = currentTime;
            count = 0;
        }
        //判断qps大小
        if (count < limit) {
            count ++;
            return true;
        }else {
            return false;
        }
    }

}
